DEL Abgabe MC1
Mini-Challenge 1: Hyperparameter und Model Tuning
Created on March 18|Last edited on March 30
Comment
Dieser Report wurde als Teil der Mini Challenge 1 für das Modul Deep Learning erstellt. Es ergänzt das Jupyter Notebook, in dem der Code enthalt und ausgeführt wurde. Dieses Dieser Report basiert auf den Resultaten, die automatisch von W&B aufgezeichnet wurden.
Schritt 1: Auswahl Task / Datensatz
Ich habe mich dazu entschieden, mit dem CIFAR10 Datensatz zu arbeiten. Laut Dokumentation handelt es sich dabei um 60'000 Bilder, wobei 50'000 im Trainingsdatensatz sind. Dies entspricht einem Train/Test Split von rund 80%. Weiter handelt es sich um Farbbilder, die 32 x 32 Pixel gross sind.
Im Datensatz sind zehn unterschiedliche Klassen enthalten: Flugzeuge, Auto, Vögel, Katzen, Hirsche, Hünde, Frösche, Pferde, Schiffe und Lastwagen. Laut Dokumentation ist in jedem Bilder genau eine Klasse enthalten und die Klassen kommen im Datensatz gleich häufig vor.
Von CIFAR gibt es auch noch einen Datensatz mit 100 Klassen. Um die Trainingszeit kurz zu halten, verwende ich den Datensatz mit 10 Klassen.
Schritt 2: Daten Kennenlernen
In diesem Abschnitt habe ich zuerst 40 Bilder und ihre Klasse angeschaut. Wie es zu erwarten war, sind relativ klein und verpixelt. Im nächsten Schritt habe ich die Histogramme der Bilder angeschaut. Die Helligkeit der Bilder ist sehr unterschiedlich, es wird also wichtig sein, diese Werte zu normieren. Dies vereinfacht das Training der Modelle. Zuletzt habe ich die Verteilung der Klassen überprüft. Wie in der Dokumentation angegeben, sind im Trainingsdatensatz je 5'000 Bilder pro Klasse und im Testdatensatz je 1'000 Bilder enthalten.
Ich bin zum Schluss gekommen, dass im Preprocessing der Daten lediglich eine Normierung stattfinden muss. Ein Rescaling oder Umwandlung in Graustufen ist nicht notwendig. Letzteres hatte ich zuerst geplant, da das Modell Muster und nicht Farben lernen muss. Dafür hätte ich Rechenleistung sparen können. Da drei zusätzliche Layers bei den grösseren beiden Modellen keinen Unterschied gemacht haben, habe ich die Farben behalten.
Schritt 3: Aufbau Modellierung
Metriken
Zur Evaluation der Modelle werde ich zwei Metriken verwenden. In erster Linie interessiert mit die Accuracy des Modelles. Die Metrik sagt aus, welcher Anteil der Predictions korrekt ist. Diese Kennzahl kann bei unbalancierten Klassen einen Bias haben, dieses Risiko kann ich dank der vorhin gezeigten Untersuchung der Klassen ausschliessen. Als zweite Kennzahl werde ich die Crossentropy Loss anschauen. Wenn das Modell zwar insgesamt gut ist (gute Predictions), aber die Unsicherheiten hoch sind, sollte ich dies in der Loss erkennen können.
Es gäbe viele weitere Metriken, die untersuchen könnte, wie Recall, Precision oder F1 Score. Doch fokussiere ich mich vorerst auf die beiden genannten.
Implementierung der Modelle
Die Modelle sind im Jupyter Notebook genauer erklärt. Zusammengefasst handelt es sich beim kleinen Modell (SmallModel) um ein simples MLP mit einem Hidden Layer. Das mittlere Modell (MediumModel_oReg_oBN) enhält zu Beginn drei Conv Layers und danach zwei FC Layers. Das grosse Modell (LargeModel_oReg_oBN) enhält vier Conv Layers und drei FC Layers. Vom grossen Modell gibt es auch Varianten mit Dropout oder Batchnorm.
Baseline Model / Overfitting
Als Baseline Model habe ich das LargeModel (LargeModel_oReg_oBN) definiert. In dieser ersten Aufgabe habe ich die Hyperparamter so optimiert, dass der Train eine Accuracy von fast 100% erreicht und deutlich overfittet. Die Learning Rate lag dabei bei 0.1 und die Batchgrösse bei 128.
Anhand der Diskrepanz zwischen Test und Train wird bei Accuracy und Loss ersichtlich, dass das Modell mit diesen Hyperparametern stark overfittet. Während die Accuracy beim Test etwa 65% beträgt, ist er beim Train auf über 98% gestiegen.
Gleich verhält es sich beim Loss. Während dieser beim Train auf fast 0 gesunken ist, ist er beim Test schon ab der achten Epoche wieder angestiegen.
Da ich das erste Mal ein Deeplearning Modell angewendet und gleichzeitig mit W&B experimentiert habe, habe ich viele Trainings durchgeführt. Da ich bereits mit dem LargeModel ein Overfitting erzielen konnte, habe ich das Modell nicht extra angepasst, um nur mit einem Sample/Batch trainieren zu können.
Run set
1
Schätzfehler
Nun habe ich den Schätzfehler der Accuracy von dem selben Modell und mit den gleichen Parametern untersucht. Da ich gesehen habe, dass der Loss ab acht Epochen wieder steigt, habe ich die Untersuchung auf zehn Epoche reduziert. Um unterschiedliche Trainingsdurchläufe zu simulieren, habe ich jeweils den Seed von Pytorch geändert. In der folgenden Auswertung zeige ich die Metriken für den Test.
Die Accuracy vom Test liegt nach vier unterschiedlichen Seeds und zehn Epochen zwischen 57.6% und 64.6%, das entspricht einer Bandbreite von 7% (resp. 10.8%). Die Standardabweichung beträgt 2.79. Allerdings führten drei Seeds zum fast gleichen Wert, während es einen deutlichen Ausreisser nach unten gab. Ich bin mir bewusst, dass die Untersuchung nur mit wenigen Läufen durchgeführt wurde und die Standardabweichung bei einer umfangreicheren Untersuchung sich ändern dürfte. Die Bandbreite ist aber trotzdem grösser, als ich erwartet habe. Ich gehe davon aus, dass mit mehr Epochen, die Abweichung sinken würde. Weiter fällt auf, dass beim Train die Metriken sehr nahe beieinander liegen. Dies wird aber davon stammen, dass pro Epoche der Mittelwert über alle Batches berechnet wurde und Ausreisser deshalb weniger stark auffallen.
Run set
4
Schritt 4: Evaluation
Training mit SGD, ohne REG, ohne BN
In diesem Schritt untersuche ich die drei Modelle (SmallModel, MediumModel_oReg_oBN und LargeModel_oReg_oBN) und die Auswirkung unterschiedlicher Hyperparameter. Dabei verwende ich unterschiedliche Learning Rates (0.1, 0.01 und 0.001) und Batchsize (64, 128 und 256).
Zur übersichtlichen Darstellung habe ich in den folgenden Plots die Resultate zuerst nach Learning Rate und dann nach Batchsize gruppiert und stelle den Mittelwert dar. Bei der eingefärbten Range handelt es sich um den Min/Max Bereich für diese Learning Rate, resp. Batchsize. Bei allen Werten handelt es sich um die Accuracy des Tests.
Nach der Accuracy folgt der Loss und dann eine Darstellung, die die einzelnen Accuracys im Zusammenhang mit ihrer Batchsize und Learning Rate darstellen. Es wurden insgesamt neun Trainings durchgeführt.
Resultat vom SmallModel
Beim kleinsten Modell lässt sich anhand der Hyperparameter nicht abschätzen, wie gut das Modell ist. Alle drei Batchsizes haben (relativ zu den anderen) gute und schlechte Test Accuracy ausgelöst. Das gleiche gilt für die Learning Rate. Wobei die mittlere LR (0.01) zumindest immer mindestens im Mittelfeld war.
Im letzten Plot wird anhand der Entwicklung vom Loss ersichtlich, dass nur die grösste Learning Rate konvergiert hat.
Aufgefallen ist, dass das Modell noch nicht ganz konvergiert hat. Bei mehr Epochen könnte das Resultat eine stärkere Tendenz aufweisen.
Run set
9
Resultat vom MediumModel
Beim Medium Model gab es schon eindeutigere Tendenzen als beim Small. Während der Batchsize weiterhin keinen Einfluss hat, lässt sich dieser bei der Learning Rate erkennen. Die beiden grösseren Learning Rates haben eine deutlich höhere Accuracy als die kleinste Learning Rate. Die kleinste Learning Rate hat bei zehn Epochen allerdings noch nicht konvergiert, entsprechend ist es zu erwarten, dass sie bei längerem Training aufholen könnte.
Run set
9
Resultat vom LargeModel
Auch beim grössten Modell hat die Batchsize keinen sichtbaren Einfluss auf die Accuracy. Hingegen ist der Einfluss der Learning Rate weiterhin stark sichtbar. Die besten Resultate stammen weiterhin von den beiden grösseren Learning Rates (0.1 und 0.01). Weil die mittlere Learning Rate (0.01) nach zehn Epoch noch nicht ganz konvergiert hat, kann ich mir vorstellen, dass sie sogar die grösste Learning Rate überholen könnte.
Run set
9
Vergleich der drei Modelle
Vor der Untersuchung habe ich erwartet, dass auch die Batchsize einen Einfluss hat. Dies konnte ich aber nicht bestätigen (auch wenn ich nur mit wenigen Runs gearbeitet habe). Hingegen ist die Learning Rate eine wichtige Komponente. Diese sollte nicht zu kleine sein, sondern eher im oberen Bereich. Dies führt nicht nur zu einer schnelleren Konvergierung, sondern in meinen Versuchen auch zu besseren Resultaten.
Vergleiche ich das jeweils beste Resultat jedes Modelles, haben das Medium und Large etwa die gleiche Test Accuracy erzielt und liegen deutlich vor dem Small. Im Vergleich zum Medium hätte ich vermutlich das Large Model um mehr als nur ein Conv und FC Layer erweitern müssen, um ein deutlich besseres Resultat zu erhalten.
Run set
3
Nutzen der Regularisierung
Ziel der Regularisierung
Bei dem Trainieren von Modellen kann es vorkommen, dass einzelne Gewichte einen hohen Wert bekommen. Das hat zur Folge, dass einzelne Variablen eine hohe Gewichtung erhalten und dass kleine Anpassungen dieser Variablen das Modell und dessen Genauigkeit stark beeinflussen können. Dies lässt sich anschaulich eines linearen Modelles mit Polynomen bis zum 15 Grad erklären. Erhalten beim Training Polynome eines höheren Grades ein hohes Gewicht, haben sie einen starken Einfluss auf das Modell. Dies hat auch zur Folge, dass das Modell overfittet. Um zu verhindern, dass einzelne Variablen hohe Gewichtungen erhalten, werden unterschiedliche Methoden angewendet.
Bei der L1/L2 Regularisierung werden die Summen der Gewichtungen zum Fehler hinzuaddiert. Das hat zur Folge, dass beim Training (und dabei der Minimierung des Fehlers) kleinere Gewichtungen bevorzugt werden. Bei der L1 Regularisierung wird der absolute Wert der Gewichtungen addiert, bei der L2 Regularisierung der quadrierte Wert.
Bei der Dropout Regularisierung werden zufälligerweise einzelne Neutronen, resp. deren Gewichtungen, auf Null gesetzt. Dies hat zur Folge, dass dem Model die Möglichkeit, sich auf einzelne Neuronen zu verlassen, entzogen wird. Beim Training muss das Modell deshalb die Gewichtungen gleichmässiger auf alle Neuronen verteilen. Es wird empfohlen, beim Input Layer einen Dropout Wahrscheinlichkeit von 20% und bei Hidden Layers eine Wahrscheinlichkeit von 50% zu verwenden. Ich werde dies so umsetzen.
Eine weitere Möglichkeit wäre Early Stopping, dabei wird das Training unterbrochen, sobald sich der Testfehler nicht mehr verbessert und anfängt zu steigen.
Zusammenfassung: In Folge der Regularisierung wird das Overfitting kleiner und damit das Resultat des Testdatensatzes weniger volatil. Allerdings besteht das Risiko, dass beim Training nicht die optimalen Gewichte gefunden werden und der Fehler höher ist, als ohne Regularisierung
L1/L2 Weight Penalty
Für diese Teilaufgabe habe ich beschlossen, die L2 Regularisierung zu untersuchen. Für die Untersuchung der Penalty verwende ich die eingebaute L2 Regularisierung von Pytorch. Diese wird als "weight_decay" in der torch.optim.SGD Funktion erfasst.
Zur Untersuchung wende ich die Regularisierung auf dem LargeModel an und wähle als Hyperparameter die, die ich vorhin als optimal festgestellt habe. Weiter starte ich einen neuen Sweep, um unterschiedliche Stärken der Regularisierung testen zu können.
Wird das Ziel der L2 Regularisierung erreicht?
Zur Info: Bei der mittleren Regularisierung hat es bei Epoche 28 einen starken Anstieg vom Loss gegeben. Ich kann ihn mir nicht erklären und kann mir nicht vorstellen, dass er aufgrund der Regularisierung entstanden ist. Denn der Ausreisser ist erst nach vielen Epochen aufgetaucht.
Das Ziel, Overfitting zu verhindern, wurde bei der stärksten Regularisierung (0.01) erreicht. Dies kann ich in den Plots auf zwei Arten bestätigen. Einerseits geht der Gap zwischen Train und Test jeweils bei Accuracy und Loss nicht auf. Das ist bei den schwächeren Regularisierungen und vom ersten Modell (Overfitting) nicht der Fall. Beim Vergleich zwischen den schwächeren beiden Regularisierungen fällt auf, dass sie einen Einfluss auf die Geschwindigkeit der Konvergierung des Trains hat.
Bestätigt wird die Verhinderung von Overfitting auch beim Vergleich der Weights vom unregularisierten und vom regularisierten Modell. Bei der L2 Regularisierung lässt sich feststellen, dass die Weights näher um den Wert 0 verstreut sind. Hingegen steigen sie unregularisiert stärker in den positiven und negativen Bereich an. Die Regularisierung bevorzugt also wie erwartet Weights mit einer tieferen, absoluten Summe.
Wie erwartet und in dieser Untersuchung klar ersichtlich, ist die Accuracy bei starker Regularisierung deutlich tiefer. Dies kommt davon, dass nicht mehr optimale Weights trainiert werden.
Run set
3
Bezüglich der L2 Regularisierung habe ich auch das Verhalten der Weights vom Modell mit L2 0.01 zum Modell ohne Regularisierung (Baseline Model) verglichen.
In der ersten Zeile werden die Weights der ersten drei Conv Layers ohne Regularisierung, in der zweiten Zeile die mit Regularisierung dargestellt. Danach folgt eine Zeile mit den drei FC ohne Regularisierung und die drei mit.
Bei den Conv Layers ohne Regularisierung lässt sich feststellen, dass sich die Weights vom Null-Punkt in den positiven und negativen Bereich ausbreiten. Sie sind auch nach 30 Epochen noch in etwa normalverteilt und haben einen Mittelwert um Null. Ich vermute, dass sie nach mehr Epochen stärker streuen würden.
Mit Regularisierung starten die Weights zwar ebenfalls normalverteilt, doch wird die Verteilung schon nach etwa fünf Epoch sehr spitz um den Null Wert. Es findet auch kein Ausbreitung der Weights statt.
Das gleiche Verhalten lässt sich bei den Weights der FC Layers feststellen. Auffällig ist aber, dass ohne Regularisierung die Weights beim FC2 und FC3 stark ausfransen. Sie sind auch nicht mehr normalverteilt. Ich kann mir vostellen, dass das Overfitting besonders in diesem Bereich stattfindet, da die Weights keinem Muster mehr folgen.
Run set
20
Dropout
Für die Untersuchung der Auswirkungen von Dropouts habe ich zu Beginn auch das Modell LargeModel_Dropout konstruiert. Dieses ist gleich wie das LargeModel, ausser dass nach dem ersten Conv und dem ersten FC Layer je ein Dropout stattfindet. Gemäss Literatur hat das Dropout des ersten Layers eine Wahrscheinlichkeit von 0.2, das zweite eine von 0.5. Ich werde das Untersuchung nur mit den Hyperparametern vom Baseline Model durchführen, dafür diese beiden vergleichen.
Die Idee von Dropout ist, dass das Modell sich nicht auf einzelne Weights verlassen kann und die Informationen sinnbildlich über alle Weights verteilen muss. Entsprechend können nicht einzelne Weights oder Neutronen sowie Features vom Input zu wichtig werden.
Wie die folgende Grafik zeigt, hat der Dropout ein Overfitting verhindert. Die Accuracy von Train und Test habe sich gleichlaufend entwickelt. Hingegen ist beim Baseline Model ersichtlich, dass das sich ein Gap geöffnet hat.
Ich bin ein bisschen überrascht, dass nur zwei Dropout Layers das Overfitting verhindert haben.
Run set
2
Nutzen von Batchnorm
Batchnorm wurde 2015 von Sergey Ioffe und Christian Szegedy entwickelt und vorgestellt. Es handelt sich um eine Methode, die die Input zwischen einzelnen Layers normiert. Es ist quasi eine Weiterführung der Praxis, Werte vor einem Training zu normieren (wie ich es im Schritt 3: Aufbau Modellierung durchgeführt habe). Die Normierung findet vor der nichtlinearen Aktivierung statt. Der Name Batchnorm kommt davon, dass die Normierung nach jedem Batch durchgeführt. In der Regel wird auf Mittelwert 0 und eine bestimmte Standardabweichung normiert.
Batchnorm hat folgende Vorteile:
- Schnelleres Training, weniger Epochen notwendig, da normierte Werte schneller konvergieren.
- Höhere Learning Rates möglich
- Initialisierung der Gewichte ist weniger wichtig, da die Werte normiert werden.
Santukar et al haben festgestellt, dass Batchnorm vor allem funktioniert, weil es die Gradienten zuverlässiger und vorhersehbarer macht. Entsprechend kann das Modell genauer und schneller trainieren.
Für die Untersuchung der Auswirkung von Batchnorm habe ich wiederum das grösste Model angepasst. Ich führe nach jedem Layer (ausser dem Output) eine Batchnorm durch. Ich führe die Normierung jeweils vor der Aktivierung durch.
Bei der Untersuchung sind zwei Merkmale aufgefallen. Einerseits hat sich die Accuracy mit Batchnorm ab einer gewissen Epoche (in diesem Fall knapp über 10) nicht mehr verändert. Ohne Batchnorm sind hingegen noch minimale Änderungen ersichtlich.
Wichtiger ist aber die Erkenntnis, dass das Modell mit Batchnorm viel schneller trainiert und die Accuracy schneller zum Grenzwert steigt. Nach fünf Epochen hatte der Train von Batch eine Accuracy, die etwa 20% Punkte höher lag und bereits abgeflacht ist.
Das gleiche Muster lässt sich beim Loss feststellen. Der Loss vom Train mit Batchnorm sinkt viel schneller. Beim Test mit Batchnorm lässt sich keine Konvergenz feststellen, da der Loss zu Beginn starkt schwankt. Die gerade Linie lässt sich aber auch beim Loss feststellen.
Run set
2
Nutzen von Adam
Weil ich festgestellt habe, dass Adam ohne Regularisierung bei einer Learning Rate von 0.1 nicht konvergiert hat und mit L2 Regularisierung nicht mal mit einer Learning Rate von 0.01, führe ich die Untersuchung zu Adam mit einer Learning Rate von 0.001 durch. Wie ich bei SGD mit dieser Learning Rate festgestellt habe, ergibt sie zwar kein gutes Resultat, aber es ist die einzige Möglichkeit, um Vergleiche durchzuführen.
Adam ohne Regularisierung
Run set
2
Adam mit L2 Regularisierung
Bei der L2 Regularisierung ist das gleiche Muster wie bei Regularisierung mit SGD ersichtlich. Ist die Regularisierung stark genug, kann Overfitting bei der Accuracy und beim Loss verhindert werden.
Run set
3
Spass mit grossen Modellen
Die MC von DEL hat mir sehr viel Spass bereitet, da ich nach drei Semestern Grundlagen endlich Deep Learning anwenden und spielerisch Kennenlernen konnte. Ich wollte deshalb unbedingt auch grössere und "professionellere" Modelle anwenden.
Das hat zu Beginn unterschiedliche Herausforderungen (wie Rechenaufwand und Anpassung der Modelle an CIFAR10) gestellt, doch habe ich zumindest ResNet50, VGG16 und AlexNet trainieren können.
Aufgrund des Rechenaufwands habe ich die Anzahl Epochen auf 15 gesetzt. Trotzdem lassen sie sich mit meinem Baseline Model vergleichen.
Ich verwende jeweils die Modelle, die Pytorch zur Verfügung stellt und sie sind pretrained auf den Bilderdatensatz "IMAGENET1K_V2".
ResNet50
ResNet50 hat Freude gemacht, weil ich beim Experimentieren Test Accuracys von über 92% erreichen konnte, was zu den Topwerten für das Modell und Datensatz gehört. Bei der Berechnung der gesamten MC habe ich auf CSCS leider nur Accuracy um 85% erreicht, vermutlich hängt das mit dem Seed zusammen, der auf einzelnen Geräten andere Initialisierung auslöst.
ResNet50 konvergiert deutlich schneller als das Baseline Modell und erzielt eine viel höhere Accuracy. Es fällt allerdings auf, dass der Loss hoch ist und dort scheinbar einen Grenzwert erreicht. Auch steigt das Loss vom Test nach 15 noch nicht an. Auch scheint es mit diesen Hyperparametern ein Overfitting zu geben, da die Accuracy von Train rund 15% höher liegt.
Run set
2
VGG16
Das Resultat von VGG16 verhält sich ähnlich wie ResNet50. Einzig der Loss ist viel tiefer, steigt beim Test aber bereits nach weniger als fünf Epochen wieder an. Das Overfitting lässt sich auch hier feststellen.
Run set
2
AlexNet
AlexNet konvergiert ebenfalls deutlich schnell als das Baseline Model. Der Loss vom Train sinkt nach 15 Epochen trotzdem noch. Die Accuracy vom Train ist auch nicht auf 100% gestiegen. Dafür scheint kein Overfitting vorhanden zu sein.
Run set
2
Vergleich der grossen Modelle
Die drei grossen Modelle liegen zwischen 85.4% und 89.3%, was einer Bandbreite von 3.9% entspricht.
Run set
3
Add a comment